home *** CD-ROM | disk | FTP | other *** search
/ Languguage OS 2 / Languguage OS II Version 10-94 (Knowledge Media)(1994).ISO / gnu / bash_114.zip / bash-1.14.2 / bashline.c < prev    next >
C/C++ Source or Header  |  1994-08-03  |  46KB  |  1,758 lines

  1. /* bashline.c -- Bash's interface to the readline library. */
  2.  
  3. /* Copyright (C) 1987,1991 Free Software Foundation, Inc.
  4.  
  5.    This file is part of GNU Bash, the Bourne Again SHell.
  6.  
  7.    Bash is free software; you can redistribute it and/or modify it
  8.    under the terms of the GNU General Public License as published by
  9.    the Free Software Foundation; either version 1, or (at your option)
  10.    any later version.
  11.  
  12.    Bash is distributed in the hope that it will be useful, but WITHOUT
  13.    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
  14.    or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public
  15.    License for more details.
  16.  
  17.    You should have received a copy of the GNU General Public License
  18.    along with Bash; see the file COPYING.  If not, write to the Free
  19.    Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
  20.  
  21. #include "bashtypes.h"
  22. #include "posixstat.h"
  23.  
  24. #include <stdio.h>
  25. #include "bashansi.h"
  26. #include <readline/readline.h>
  27. #include <readline/history.h>
  28. #include "shell.h"
  29. #include "builtins.h"
  30. #include "builtins/common.h"
  31. #include "bashhist.h"
  32. #include "execute_cmd.h"
  33.  
  34. #if defined (ALIAS)
  35. #  include "alias.h"
  36. #endif
  37.  
  38. #if defined (BRACE_EXPANSION)
  39. #  define BRACE_COMPLETION
  40. #endif /* BRACE_EXPANSION */
  41.  
  42. #if defined (BRACE_COMPLETION)
  43. extern void bash_brace_completion ();
  44. #endif /* BRACE_COMPLETION */
  45.  
  46. /* Functions bound to keys in Readline for Bash users. */
  47. static void shell_expand_line ();
  48. static void display_shell_version (), operate_and_get_next ();
  49. static void history_expand_line (), bash_ignore_filenames ();
  50.  
  51. /* Helper functions for Readline. */
  52. static int bash_directory_completion_hook ();
  53. static void filename_completion_ignore ();
  54. static void bash_push_line ();
  55.  
  56. static char **attempt_shell_completion ();
  57. static char *variable_completion_function ();
  58. static char *hostname_completion_function ();
  59. static char *command_word_completion_function ();
  60. static char *command_subst_completion_function ();
  61.  
  62. static void snarf_hosts_from_file (), add_host_name ();
  63. static void sort_hostname_list ();
  64.  
  65. #define DYNAMIC_HISTORY_COMPLETION
  66. #if defined (DYNAMIC_HISTORY_COMPLETION)
  67. static void dynamic_complete_history ();
  68. #endif /* DYNAMIC_HISTORY_COMPLETION */
  69.  
  70. /* Variables used here but defined in other files. */
  71. extern int posixly_correct, no_symbolic_links;
  72. extern int rl_explicit_arg;
  73. extern char *current_prompt_string, *ps1_prompt;
  74. extern STRING_INT_ALIST word_token_alist[];
  75. extern Function *rl_last_func;
  76. extern int rl_filename_completion_desired;
  77.  
  78. /* SPECIFIC_COMPLETION_FUNCTIONS specifies that we have individual
  79.    completion functions which indicate what type of completion should be
  80.    done (at or before point) that can be bound to key sequences with
  81.    the readline library. */
  82. #define SPECIFIC_COMPLETION_FUNCTIONS
  83.  
  84. #if defined (SPECIFIC_COMPLETION_FUNCTIONS)
  85. static void
  86.   bash_specific_completion (),
  87.   bash_complete_filename (), bash_possible_filename_completions (),
  88.   bash_complete_filename_internal (),
  89.   bash_complete_username (), bash_possible_username_completions (),
  90.   bash_complete_username_internal (),
  91.   bash_complete_hostname (), bash_possible_hostname_completions (),
  92.   bash_complete_hostname_internal (),
  93.   bash_complete_variable (), bash_possible_variable_completions (),
  94.   bash_complete_variable_internal (),
  95.   bash_complete_command (), bash_possible_command_completions (),
  96.   bash_complete_command_internal ();
  97. #endif /* SPECIFIC_COMPLETION_FUNCTIONS */
  98.  
  99. /* Non-zero once initalize_readline () has been called. */
  100. int bash_readline_initialized = 0;
  101.  
  102. #if defined (VI_MODE)
  103. static void vi_edit_and_execute_command ();
  104. #endif
  105.  
  106. static Function *old_rl_startup_hook = (Function *) NULL;
  107.  
  108. /* Change the readline VI-mode keymaps into or out of Posix.2 compliance.
  109.    Called when the shell is put into or out of `posix' mode. */
  110. void
  111. posix_readline_initialize (on_or_off)
  112.      int on_or_off;
  113. {
  114. #if defined (VI_MODE)
  115.   if (on_or_off)
  116.     {
  117.       rl_bind_key_in_map (CTRL('I'), rl_insert, vi_insertion_keymap);
  118.       if (rl_vi_comment_begin)
  119.     free (rl_vi_comment_begin);
  120.       rl_vi_comment_begin = savestring ("#");
  121.     }
  122.   else
  123.     rl_bind_key_in_map (CTRL('I'), rl_complete, vi_insertion_keymap);
  124. #endif
  125.  
  126. /* Called once from parse.y if we are going to use readline. */
  127. void
  128. initialize_readline ()
  129. {
  130.   if (bash_readline_initialized)
  131.     return;
  132.  
  133.   rl_terminal_name = get_string_value ("TERM");
  134.   rl_instream = stdin;
  135.   rl_outstream = stderr;
  136.   rl_special_prefixes = "$@";
  137.  
  138.   /* Allow conditional parsing of the ~/.inputrc file. */
  139.   rl_readline_name = "Bash";
  140.  
  141.   /* Bind up our special shell functions. */
  142.   rl_add_defun ("shell-expand-line", (Function *)shell_expand_line, -1);
  143.   rl_bind_key_in_map
  144.     (CTRL('E'), (Function *)shell_expand_line, emacs_meta_keymap);
  145.  
  146.   /* Bind up our special shell functions. */
  147.   rl_add_defun ("history-expand-line", (Function *)history_expand_line, -1);
  148.   rl_bind_key_in_map ('^', (Function *)history_expand_line, emacs_meta_keymap);
  149.  
  150.   /* Backwards compatibility. */
  151.   rl_add_defun ("insert-last-argument", rl_yank_last_arg, -1);
  152.  
  153.   rl_add_defun
  154.     ("operate-and-get-next", (Function *)operate_and_get_next, CTRL('O'));
  155.  
  156.   rl_add_defun
  157.     ("display-shell-version", (Function *)display_shell_version, -1);
  158.  
  159.   rl_bind_key_in_map
  160.     (CTRL ('V'), (Function *)display_shell_version, emacs_ctlx_keymap);
  161.  
  162.   /* In Bash, the user can switch editing modes with "set -o [vi emacs]",
  163.      so it is not necessary to allow C-M-j for context switching.  Turn
  164.      off this occasionally confusing behaviour. */
  165.   rl_unbind_key_in_map (CTRL('J'), emacs_meta_keymap);
  166.   rl_unbind_key_in_map (CTRL('M'), emacs_meta_keymap);
  167.  
  168. #if defined (BRACE_COMPLETION)
  169.   rl_add_defun ("complete-into-braces", bash_brace_completion, -1);
  170.   rl_bind_key_in_map ('{', bash_brace_completion, emacs_meta_keymap);
  171. #endif /* BRACE_COMPLETION */
  172.  
  173. #if defined (SPECIFIC_COMPLETION_FUNCTIONS)
  174.   rl_add_defun ("complete-filename", bash_complete_filename, -1);
  175.   rl_bind_key_in_map ('/', bash_complete_filename, emacs_meta_keymap);
  176.   rl_add_defun ("possible-filename-completions",
  177.         bash_possible_filename_completions, -1);
  178.   rl_bind_key_in_map ('/', bash_possible_filename_completions,
  179.               emacs_ctlx_keymap);
  180.  
  181.   rl_add_defun ("complete-username", bash_complete_username, -1);
  182.   rl_bind_key_in_map ('~', bash_complete_username, emacs_meta_keymap);
  183.   rl_add_defun ("possible-username-completions",
  184.         bash_possible_username_completions, -1);
  185.   rl_bind_key_in_map ('~', bash_possible_username_completions,
  186.               emacs_ctlx_keymap);
  187.  
  188.   rl_add_defun ("complete-hostname", bash_complete_hostname, -1);
  189.   rl_bind_key_in_map ('@', bash_complete_hostname, emacs_meta_keymap);
  190.   rl_add_defun ("possible-hostname-completions",
  191.         bash_possible_hostname_completions, -1);
  192.   rl_bind_key_in_map ('@', bash_possible_hostname_completions,
  193.               emacs_ctlx_keymap);
  194.  
  195.   rl_add_defun ("complete-variable", bash_complete_variable, -1);
  196.   rl_bind_key_in_map ('$', bash_complete_variable, emacs_meta_keymap);
  197.   rl_add_defun ("possible-variable-completions",
  198.         bash_possible_variable_completions, -1);
  199.   rl_bind_key_in_map ('$', bash_possible_variable_completions,
  200.               emacs_ctlx_keymap);
  201.  
  202.   rl_add_defun ("complete-command", bash_complete_command, -1);
  203.   rl_bind_key_in_map ('!', bash_complete_command, emacs_meta_keymap);
  204.   rl_add_defun ("possible-command-completions",
  205.         bash_possible_command_completions, -1);
  206.   rl_bind_key_in_map ('!', bash_possible_command_completions,
  207.               emacs_ctlx_keymap);
  208.  
  209. #endif /* SPECIFIC_COMPLETION_FUNCTIONS */
  210.  
  211. #if defined (DYNAMIC_HISTORY_COMPLETION)
  212.   rl_add_defun ("dynamic-complete-history", dynamic_complete_history, -1);
  213.   rl_bind_key_in_map (TAB, dynamic_complete_history, emacs_meta_keymap);
  214. #endif /* DYNAMIC_HISTORY_COMPLETION */
  215.  
  216.   /* Tell the completer that we want a crack first. */
  217.   rl_attempted_completion_function = (CPPFunction *)attempt_shell_completion;
  218.  
  219.   /* Tell the completer that we might want to follow symbolic links or
  220.      do other expansion on directory names. */
  221.   rl_directory_completion_hook = bash_directory_completion_hook;
  222.  
  223.   /* Tell the filename completer we want a chance to ignore some names. */
  224.   rl_ignore_some_completions_function = (Function *)filename_completion_ignore;
  225.  
  226. #if defined (VI_MODE)
  227.   rl_bind_key_in_map ('v', vi_edit_and_execute_command, vi_movement_keymap);
  228. #endif
  229.  
  230.   rl_completer_quote_characters = "'\"";
  231.   /* Need to modify this from the default; `$', `{', `\', and ``' are not
  232.      word break characters. */
  233.   rl_completer_word_break_characters = " \t\n\"'@><=;|&("; /**/
  234.  
  235.   if (posixly_correct)
  236.     posix_readline_initialize (1);
  237.  
  238.   bash_readline_initialized = 1;
  239. }
  240.  
  241. /* On Sun systems at least, rl_attempted_completion_function can end up
  242.    getting set to NULL, and rl_completion_entry_function set to do command
  243.    word completion if Bash is interrupted while trying to complete a command
  244.    word.  This just resets all the completion functions to the right thing.
  245.    It's called from throw_to_top_level(). */
  246. void
  247. bashline_reinitialize ()
  248. {
  249.   tilde_initialize ();
  250.   rl_attempted_completion_function = attempt_shell_completion;
  251.   rl_directory_completion_hook = bash_directory_completion_hook;
  252.   rl_ignore_some_completions_function = (Function *)filename_completion_ignore;
  253. }
  254.  
  255. /* Contains the line to push into readline. */
  256. static char *push_to_readline = (char *)NULL;
  257.  
  258. /* Push the contents of push_to_readline into the
  259.    readline buffer. */
  260. static void
  261. bash_push_line ()
  262. {
  263.   if (push_to_readline)
  264.     {
  265.       rl_insert_text (push_to_readline);
  266.       free (push_to_readline);
  267.       push_to_readline = (char *)NULL;
  268.       rl_startup_hook = old_rl_startup_hook;
  269.     }
  270. }
  271.  
  272. /* Call this to set the initial text for the next line to read
  273.    from readline. */
  274. int
  275. bash_re_edit (line)
  276.      char *line;
  277. {
  278.   if (push_to_readline)
  279.     free (push_to_readline);
  280.  
  281.   push_to_readline = savestring (line);
  282.   old_rl_startup_hook = rl_startup_hook;
  283.   rl_startup_hook = (Function *)bash_push_line;
  284.  
  285.   return (0);
  286. }
  287.  
  288. static void
  289. display_shell_version (count, c)
  290.      int count, c;
  291. {
  292.   crlf ();
  293.   show_shell_version ();
  294.   putc ('\r', rl_outstream);
  295.   fflush (rl_outstream);
  296.   rl_on_new_line ();
  297.   rl_redisplay ();
  298. }
  299.  
  300. /* **************************************************************** */
  301. /*                                    */
  302. /*                 Readline Stuff                */
  303. /*                                    */
  304. /* **************************************************************** */
  305.  
  306. /* If the user requests hostname completion, then simply build a list
  307.    of hosts, and complete from that forever more. */
  308. #if !defined (ETCHOSTS)
  309. #define ETCHOSTS "/etc/hosts"
  310. #endif
  311.  
  312. /* The kept list of hostnames. */
  313. static char **hostname_list = (char **)NULL;
  314.  
  315. /* The physical size of the above list. */
  316. static int hostname_list_size = 0;
  317.  
  318. /* The length of the above list. */
  319. static int hostname_list_length = 0;
  320.  
  321. /* Whether or not HOSTNAME_LIST has been initialized. */
  322. int hostname_list_initialized = 0;
  323.  
  324. /* Non-zero means that HOSTNAME_LIST needs to be sorted. */
  325. static int hostname_list_needs_sorting = 0;
  326.  
  327. /* Initialize the hostname completion table. */
  328. static void
  329. initialize_hostname_list ()
  330. {
  331.   char *temp = get_string_value ("hostname_completion_file");
  332.  
  333.   if (!temp)
  334.     temp = ETCHOSTS;
  335.  
  336.   snarf_hosts_from_file (temp);
  337.   sort_hostname_list ();
  338.   if (hostname_list)
  339.     hostname_list_initialized++;
  340. }
  341.  
  342. /* Add NAME to the list of hosts. */
  343. static void
  344. add_host_name (name)
  345.      char *name;
  346. {
  347.   if (hostname_list_length + 2 > hostname_list_size)
  348.     {
  349.       hostname_list = (char **)
  350.     xrealloc (hostname_list,
  351.           (1 + (hostname_list_size += 100)) * sizeof (char *));
  352.     }
  353.  
  354.   hostname_list[hostname_list_length] = savestring (name);
  355.   hostname_list[++hostname_list_length] = (char *)NULL;
  356.   hostname_list_needs_sorting++;
  357. }
  358.  
  359. /* After you have added some names, you should sort the list of names. */
  360. static void
  361. sort_hostname_list ()
  362. {
  363.   if (hostname_list_needs_sorting && hostname_list)
  364.     sort_char_array (hostname_list);
  365.   hostname_list_needs_sorting = 0;
  366. }
  367.  
  368. #define cr_whitespace(c) ((c) == '\r' || (c) == '\n' || whitespace(c))
  369.  
  370. static void
  371. snarf_hosts_from_file (filename)
  372.      char *filename;
  373. {
  374.   FILE *file = fopen (filename, "r");
  375.   char *temp, buffer[256], name[256];
  376.   register int i, start;
  377.  
  378.   if (!file)
  379.     return;
  380.  
  381.   while (temp = fgets (buffer, 255, file))
  382.     {
  383.       /* Skip to first character. */
  384.       for (i = 0; buffer[i] && cr_whitespace (buffer[i]); i++);
  385.  
  386.       /* If comment, ignore. */
  387.       if (buffer[i] == '#')
  388.     continue;
  389.  
  390.       /* If `preprocessor' directive, do the include. */
  391.       if (strncmp (&buffer[i], "$include ", 9) == 0)
  392.     {
  393.       char *includefile = &buffer[i + 9];
  394.       char *t;
  395.  
  396.       /* Find start of filename. */
  397.       while (*includefile && whitespace (*includefile))
  398.         includefile++;
  399.  
  400.       t = includefile;
  401.  
  402.       /* Find end of filename. */
  403.       while (*t && !cr_whitespace (*t))
  404.         t++;
  405.  
  406.       *t = '\0';
  407.  
  408.       snarf_hosts_from_file (includefile);
  409.       continue;
  410.     }
  411.  
  412.       /* Skip internet address. */
  413.       for (; buffer[i] && !cr_whitespace (buffer[i]); i++);
  414.  
  415.       /* Gobble up names.  Each name is separated with whitespace. */
  416.       while (buffer[i] && buffer[i] != '#')
  417.     {
  418.       for (; i && cr_whitespace (buffer[i]); i++);
  419.       if (buffer[i] ==  '#')
  420.         continue;
  421.       for (start = i; buffer[i] && !cr_whitespace (buffer[i]); i++);
  422.       if ((i - start) == 0)
  423.         continue;
  424.       strncpy (name, buffer + start, i - start);
  425.       name[i - start] = '\0';
  426.       add_host_name (name);
  427.     }
  428.     }
  429.   fclose (file);
  430. }
  431.  
  432. /* Return a NULL terminated list of hostnames which begin with TEXT.
  433.    Initialize the hostname list the first time if neccessary.
  434.    The array is malloc ()'ed, but not the individual strings. */
  435. static char **
  436. hostnames_matching (text)
  437.      char *text;
  438. {
  439.   register int i, len = strlen (text);
  440.   register int begin, end;
  441.   int last_search = -1;
  442.   char **result = (char **)NULL;
  443.  
  444.   if (!hostname_list_initialized)
  445.     {
  446.       initialize_hostname_list ();
  447.  
  448.       if (!hostname_list_initialized)
  449.     return ((char **)NULL);
  450.     }
  451.  
  452.   sort_hostname_list ();
  453.  
  454.   /* The list is sorted.  Do a binary search on it for the first character
  455.      in TEXT, and then grovel the names of interest. */
  456.   begin = 0; end = hostname_list_length;
  457.  
  458.   /* Special case.  If TEXT consists of nothing, then the whole list is
  459.      what is desired. */
  460.   if (!*text)
  461.     {
  462.       result = (char **)xmalloc ((1 + hostname_list_length) * sizeof (char *));
  463.       for (i = 0; i < hostname_list_length; i++)
  464.     result[i] = hostname_list[i];
  465.       result[i] = (char *)NULL;
  466.       return (result);
  467.     }
  468.  
  469.   /* Scan until found, or failure. */
  470.   while (end != begin)
  471.     {
  472.       int r = 0;
  473.  
  474.       i = ((end - begin) / 2) + begin;
  475.       if (i == last_search)
  476.     break;
  477.  
  478.       if (hostname_list[i] &&
  479.       (r = strncmp (hostname_list[i], text, len)) == 0)
  480.     {
  481.       while (strncmp (hostname_list[i], text, len) == 0 && i) i--;
  482.       if (strncmp (hostname_list[i], text, len) != 0) i++;
  483.  
  484.       begin = i;
  485.       while (hostname_list[i] &&
  486.          strncmp (hostname_list[i], text, len) == 0) i++;
  487.       end = i;
  488.  
  489.       result = (char **)xmalloc ((1 + (end - begin)) * sizeof (char *));
  490.       for (i = 0; i + begin < end; i++)
  491.         result[i] = hostname_list[begin + i];
  492.       result[i] = (char *)NULL;
  493.       return (result);
  494.     }
  495.  
  496.       last_search = i;
  497.  
  498.       if (r < 0)
  499.     begin = i;
  500.       else
  501.     end = i;
  502.     }
  503.   return ((char **)NULL);
  504. }
  505.  
  506. /* The equivalent of the K*rn shell C-o operate-and-get-next-history-line
  507.    editing command. */
  508. static int saved_history_line_to_use = 0;
  509.  
  510. static void
  511. set_saved_history ()
  512. {
  513.   if (saved_history_line_to_use)
  514.     rl_get_previous_history (history_length - saved_history_line_to_use);
  515.   saved_history_line_to_use = 0;
  516.   rl_startup_hook = old_rl_startup_hook;
  517. }  
  518.  
  519. static void
  520. operate_and_get_next (count, c)
  521.      int count, c;
  522. {
  523.   int where;
  524.  
  525.   /* Accept the current line. */
  526.   rl_newline ();    
  527.  
  528.   /* Find the current line, and find the next line to use. */
  529.   where = where_history ();
  530.  
  531.   if ((history_is_stifled () && (history_length >= max_input_history)) ||
  532.       (where >= history_length - 1))
  533.     saved_history_line_to_use = where;
  534.   else
  535.     saved_history_line_to_use = where + 1;
  536.  
  537.   old_rl_startup_hook = rl_startup_hook;
  538.   rl_startup_hook = (Function *)set_saved_history;
  539. }
  540.  
  541. #if defined (VI_MODE)
  542. /* This vi mode command causes VI_EDIT_COMMAND to be run on the current
  543.    command being entered (if no explicit argument is given), otherwise on
  544.    a command from the history file. */
  545.  
  546. #define VI_EDIT_COMMAND "fc -e ${VISUAL:-${EDITOR:-vi}}"
  547.  
  548. static void
  549. vi_edit_and_execute_command (count, c)
  550. {
  551.   char *command;
  552.  
  553.   /* Accept the current line. */
  554.   rl_newline ();    
  555.  
  556.   if (rl_explicit_arg)
  557.     {
  558.       command = xmalloc (strlen (VI_EDIT_COMMAND) + 8);
  559.       sprintf (command, "%s %d", VI_EDIT_COMMAND, count);
  560.     }
  561.   else
  562.     {
  563.       /* Take the command we were just editing, add it to the history file,
  564.      then call fc to operate on it.  We have to add a dummy command to
  565.      the end of the history because fc ignores the last command (assumes
  566.      it's supposed to deal with the command before the `fc'). */
  567.       using_history ();
  568.       add_history (rl_line_buffer);
  569.       add_history ("");
  570.       history_lines_this_session++;
  571.       using_history ();
  572.       command = savestring (VI_EDIT_COMMAND);
  573.     }
  574.   parse_and_execute (command, "v", -1);
  575. }
  576. #endif /* VI_MODE */
  577.  
  578. /* **************************************************************** */
  579. /*                                    */
  580. /*            How To Do Shell Completion            */
  581. /*                                    */
  582. /* **************************************************************** */
  583.  
  584. /* Do some completion on TEXT.  The indices of TEXT in RL_LINE_BUFFER are
  585.    at START and END.  Return an array of matches, or NULL if none. */
  586. static char **
  587. attempt_shell_completion (text, start, end)
  588.      char *text;
  589.      int start, end;
  590. {
  591.   int in_command_position, ti;
  592.   char **matches = (char **)NULL;
  593.   char *command_separator_chars = ";|&{(`";
  594.  
  595.   rl_ignore_some_completions_function =
  596.     (Function *)filename_completion_ignore;
  597.  
  598.   /* Determine if this could be a command word.  It is if it appears at
  599.      the start of the line (ignoring preceding whitespace), or if it
  600.      appears after a character that separates commands.  It cannot be a
  601.      command word if we aren't at the top-level prompt. */
  602.   ti = start - 1;
  603.  
  604.   while ((ti > -1) && (whitespace (rl_line_buffer[ti])))
  605.     ti--;
  606.  
  607.   in_command_position = 0;
  608.   if (ti < 0)
  609.     {
  610.       /* Only do command completion at the start of a line when we
  611.          are prompting at the top level. */
  612.       if (current_prompt_string == ps1_prompt)
  613.     in_command_position++;
  614.     }
  615.   else if (member (rl_line_buffer[ti], command_separator_chars))
  616.     {
  617.       register int this_char, prev_char;
  618.  
  619.       in_command_position++;
  620.  
  621.       /* Handle the two character tokens `>&', `<&', and `>|'.
  622.          We are not in a command position after one of these. */
  623.       this_char = rl_line_buffer[ti];
  624.       prev_char = rl_line_buffer[ti - 1];
  625.  
  626.       if ((this_char == '&' && (prev_char == '<' || prev_char == '>')) ||
  627.       (this_char == '|' && prev_char == '>'))
  628.     in_command_position = 0;
  629.       else if (char_is_quoted (rl_line_buffer, ti))
  630.     in_command_position = 0;
  631.     }
  632.   else
  633.     {
  634.       /* This still could be in command position.  It is possible
  635.      that all of the previous words on the line are variable
  636.      assignments. */
  637.     }
  638.  
  639.   /* Special handling for command substitution.  XXX - this should handle
  640.      `$(' as well. */
  641.   if (*text == '`' && unclosed_pair (rl_line_buffer, start, "`"))
  642.     matches = completion_matches (text, command_subst_completion_function);
  643.  
  644.   /* Variable name? */
  645.   if (!matches && *text == '$')
  646.     matches = completion_matches (text, variable_completion_function);
  647.  
  648.   /* If the word starts in `~', and there is no slash in the word, then
  649.      try completing this word as a username. */
  650.   if (!matches && *text == '~' && !strchr (text, '/'))
  651.     matches = completion_matches (text, username_completion_function);
  652.  
  653.   /* Another one.  Why not?  If the word starts in '@', then look through
  654.      the world of known hostnames for completion first. */
  655.   if (!matches && *text == '@')
  656.     matches = completion_matches (text, hostname_completion_function);
  657.  
  658.   /* And last, (but not least) if this word is in a command position, then
  659.      complete over possible command names, including aliases, functions,
  660.      and command names. */
  661.   if (!matches && in_command_position)
  662.     {
  663.       matches = completion_matches (text, command_word_completion_function);
  664.       /* If we are attempting command completion and nothing matches, we
  665.      do not want readline to perform filename completion for us.  We
  666.      still want to be able to complete partial pathnames, so set the
  667.      completion ignore function to something which will remove filenames
  668.      and leave directories in the match list. */
  669.       if (!matches)
  670.     rl_ignore_some_completions_function = (Function *)bash_ignore_filenames;
  671.     }
  672.  
  673.   return (matches);
  674. }
  675.  
  676. /* This is the function to call when the word to complete is in a position
  677.    where a command word can be found.  It grovels $PATH, looking for commands
  678.    that match.  It also scans aliases, function names, and the shell_builtin
  679.    table. */
  680. static char *
  681. command_word_completion_function (hint_text, state)
  682.      char *hint_text;
  683.      int state;
  684. {
  685.   static char *hint = (char *)NULL;
  686.   static char *path = (char *)NULL;
  687.   static char *val = (char *)NULL;
  688.   static char *filename_hint = (char *)NULL;
  689.   static int path_index, hint_len, istate;
  690.   static int mapping_over, local_index;
  691.   static SHELL_VAR **varlist = (SHELL_VAR **)NULL;
  692. #if defined (ALIAS)
  693.   static ASSOC **alias_list = (ASSOC **)NULL;
  694. #endif /* ALIAS */
  695.  
  696.   /* We have to map over the possibilities for command words.  If we have
  697.      no state, then make one just for that purpose. */
  698.  
  699.   if (!state)
  700.     {
  701.       if (hint)
  702.     free (hint);
  703.  
  704.       mapping_over = 0;
  705.       val = (char *)NULL;
  706.  
  707.       /* If this is an absolute program name, do not check it against
  708.      aliases, reserved words, functions or builtins.  We must check
  709.      whether or not it is unique, and, if so, whether that filename
  710.      is executable. */
  711.       if (absolute_program (hint_text))
  712.     {
  713.       /* Perform tilde expansion on what's passed, so we don't end up
  714.          passing filenames with tildes directly to stat(). */
  715.       if (*hint_text == '~')
  716.         hint = tilde_expand (hint_text);
  717.       else
  718.         hint = savestring (hint_text);
  719.       hint_len = strlen (hint);
  720.  
  721.       if (filename_hint)
  722.         free (filename_hint);
  723.       filename_hint = savestring (hint);
  724.  
  725.       mapping_over = 4;
  726.       istate = 0;
  727.       goto inner;
  728.     }
  729.  
  730.       hint = savestring (hint_text);
  731.       hint_len = strlen (hint);
  732.  
  733.       path = get_string_value ("PATH");
  734.       path_index = 0;
  735.  
  736.       /* Initialize the variables for each type of command word. */
  737.       local_index = 0;
  738.  
  739.       if (varlist)
  740.     free (varlist);
  741.  
  742.       varlist = all_visible_functions ();
  743.  
  744. #if defined (ALIAS)
  745.       if (alias_list)
  746.     free (alias_list);
  747.  
  748.       alias_list = all_aliases ();
  749. #endif /* ALIAS */
  750.     }
  751.  
  752.   /* mapping_over says what we are currently hacking.  Note that every case
  753.      in this list must fall through when there are no more possibilities. */
  754.  
  755.   switch (mapping_over)
  756.     {
  757.     case 0:            /* Aliases come first. */
  758. #if defined (ALIAS)
  759.       while (alias_list && alias_list[local_index])
  760.     {
  761.       register char *alias;
  762.  
  763.       alias = alias_list[local_index++]->name;
  764.  
  765.       if (STREQN (alias, hint, hint_len))
  766.         return (savestring (alias));
  767.     }
  768. #endif /* ALIAS */
  769.       local_index = 0;
  770.       mapping_over++;
  771.  
  772.     case 1:            /* Then shell reserved words. */
  773.       {
  774.     while (word_token_alist[local_index].word)
  775.       {
  776.         register char *reserved_word;
  777.  
  778.         reserved_word = word_token_alist[local_index++].word;
  779.  
  780.         if (STREQN (reserved_word, hint, hint_len))
  781.           return (savestring (reserved_word));
  782.       }
  783.     local_index = 0;
  784.     mapping_over++;
  785.       }
  786.  
  787.     case 2:            /* Then function names. */
  788.       while (varlist && varlist[local_index])
  789.     {
  790.       register char *varname;
  791.  
  792.       varname = varlist[local_index++]->name;
  793.  
  794.       if (STREQN (varname, hint, hint_len))
  795.         return (savestring (varname));
  796.     }
  797.       local_index = 0;
  798.       mapping_over++;
  799.  
  800.     case 3:            /* Then shell builtins. */
  801.       for (; local_index < num_shell_builtins; local_index++)
  802.     {
  803.       /* Ignore it if it doesn't have a function pointer or if it
  804.          is not currently enabled. */
  805.       if (!shell_builtins[local_index].function ||
  806.           (shell_builtins[local_index].flags & BUILTIN_ENABLED) == 0)
  807.         continue;
  808.  
  809.       if (STREQN (shell_builtins[local_index].name, hint, hint_len))
  810.         {
  811.           int i = local_index++;
  812.  
  813.           return (savestring (shell_builtins[i].name));
  814.         }
  815.     }
  816.       local_index = 0;
  817.       mapping_over++;
  818.     }
  819.  
  820.   /* Repeatedly call filename_completion_func<tion while we have
  821.      members of PATH left.  Question:  should we stat each file?
  822.      Answer: we call executable_file () on each file. */
  823.  outer:
  824.  
  825.   istate = (val != (char *)NULL);
  826.  
  827.   if (!istate)
  828.     {
  829.       char *current_path;
  830.  
  831.       /* Get the next directory from the path.  If there is none, then we
  832.      are all done. */
  833.       if (!path || !path[path_index] ||
  834.       (current_path = extract_colon_unit (path, &path_index)) == 0)
  835.     return ((char *)NULL);
  836.  
  837.       if (*current_path == 0)
  838.     {
  839.       free (current_path);
  840.       current_path = savestring (".");
  841.     }
  842.  
  843.       if (*current_path == '~')
  844.     {
  845.       char *t;
  846.  
  847.       t = tilde_expand (current_path);
  848.       free (current_path);
  849.       current_path = t;
  850.     }
  851.  
  852.       if (filename_hint)
  853.     free (filename_hint);
  854.  
  855.       filename_hint = xmalloc (2 + strlen (current_path) + hint_len);
  856.       sprintf (filename_hint, "%s/%s", current_path, hint);
  857.  
  858.       free (current_path);
  859.     }
  860.  
  861.  inner:
  862.   val = filename_completion_function (filename_hint, istate);
  863.   istate = 1;
  864.  
  865.   if (!val)
  866.     {
  867.       /* If the hint text is an absolute program, then don't bother
  868.      searching through PATH. */
  869.       if (absolute_program (hint))
  870.     return ((char *)NULL);
  871.  
  872.       goto outer;
  873.     }
  874.   else
  875.     {
  876.       int match;
  877.       char *temp;
  878.  
  879.       if (absolute_program (hint))
  880.     {
  881.       match = strncmp (val, hint, hint_len) == 0;
  882.       /* If we performed tilde expansion, restore the original
  883.          filename. */
  884.       if (*hint_text == '~')
  885.         {
  886.           int l, tl, vl;
  887.           vl = strlen (val);
  888.           tl = strlen (hint_text);
  889.           l = vl - hint_len;    /* # of chars added */
  890.           temp = xmalloc (l + 2 + tl);
  891.           strcpy (temp, hint_text);
  892.           strcpy (temp + tl, val + vl - l);
  893.         }
  894.       else
  895.         temp = savestring (val);
  896.     }
  897.       else
  898.     {
  899.       temp = strrchr (val, '/');
  900.  
  901.       if (temp)
  902.         {
  903.           temp++;
  904.           match = strncmp (temp, hint, hint_len) == 0;
  905.           if (match)
  906.         temp = savestring (temp);
  907.         }
  908.       else
  909.         match = 0;
  910.     }
  911.  
  912.       /* If we have found a match, and it is an executable file, return it. */
  913.       if (match && executable_file (val))
  914.     {
  915.       free (val);
  916.       val = "";        /* So it won't be NULL. */
  917.       return (temp);
  918.     }
  919.       else
  920.     {
  921.       free (val);
  922.       goto inner;
  923.     }
  924.     }
  925. }
  926.  
  927. static char *
  928. command_subst_completion_function (text, state)
  929.      int state;
  930.      char *text;
  931. {
  932.   char **matches = (char **)NULL;
  933.   static char *orig_start, *filename_text = (char *)NULL;
  934.   static int cmd_index, start_len;
  935.  
  936.   if (state == 0)
  937.     {
  938.       if (filename_text)
  939.     free (filename_text);
  940.       orig_start = text;
  941.       if (*text == '`')
  942.         text++;
  943.       else if (*text == '$' && text[1] == '(')
  944.         text += 2;
  945.       start_len = text - orig_start;
  946.       filename_text = savestring (text);
  947.       if (matches)
  948.     free (matches);
  949.       matches = completion_matches (filename_text, command_word_completion_function);
  950.       cmd_index = 0;
  951.     }
  952.  
  953.   if (!matches || !matches[cmd_index])
  954.     {
  955.       rl_filename_quoting_desired = 0;    /* disable quoting */
  956.       return ((char *)NULL);
  957.     }
  958.   else
  959.     {
  960.       char *value;
  961.  
  962.       value = xmalloc (1 + start_len + strlen (matches[cmd_index]));
  963.  
  964.       if (start_len == 1)
  965.         value[0] = *orig_start;
  966.       else
  967.         strncpy (value, orig_start, start_len);
  968.  
  969.       strcpy (value + start_len, matches[cmd_index]);
  970.  
  971.       cmd_index++;
  972.       return (value);
  973.     }
  974. }
  975.  
  976. /* Okay, now we write the entry_function for variable completion. */
  977. static char *
  978. variable_completion_function (text, state)
  979.      int state;
  980.      char *text;
  981. {
  982.   register SHELL_VAR *var = (SHELL_VAR *)NULL;
  983.   static SHELL_VAR **varlist = (SHELL_VAR **)NULL;
  984.   static int varlist_index;
  985.   static char *varname = (char *)NULL;
  986.   static int namelen;
  987.   static int first_char, first_char_loc;
  988.  
  989.   if (!state)
  990.     {
  991.       if (varname)
  992.     free (varname);
  993.  
  994.       first_char_loc = 0;
  995.       first_char = text[0];
  996.  
  997.       if (first_char == '$')
  998.     first_char_loc++;
  999.  
  1000.       varname = savestring (text + first_char_loc);
  1001.  
  1002.       namelen = strlen (varname);
  1003.       if (varlist)
  1004.     free (varlist);
  1005.       varlist = all_visible_variables ();
  1006.       varlist_index = 0;
  1007.     }
  1008.  
  1009.   while (varlist && varlist[varlist_index])
  1010.     {
  1011.       var = varlist[varlist_index];
  1012.  
  1013.       /* Compare.  You can't do better than Zayre.  No text is also
  1014.      a match.  */
  1015.       if (!*varname || (strncmp (varname, var->name, namelen) == 0))
  1016.     break;
  1017.       varlist_index++;
  1018.     }
  1019.  
  1020.   if (!varlist || !varlist[varlist_index])
  1021.     {
  1022.       return ((char *)NULL);
  1023.     }
  1024.   else
  1025.     {
  1026.       char *value = xmalloc (2 + strlen (var->name));
  1027.  
  1028.       if (first_char_loc)
  1029.     *value = first_char;
  1030.  
  1031.       strcpy (&value[first_char_loc], var->name);
  1032.  
  1033.       varlist_index++;
  1034.       return (value);
  1035.     }
  1036. }
  1037.  
  1038. /* How about a completion function for hostnames? */
  1039. static char *
  1040. hostname_completion_function (text, state)
  1041.      int state;
  1042.      char *text;
  1043. {
  1044.   static char **list = (char **)NULL;
  1045.   static int list_index = 0;
  1046.   static int first_char, first_char_loc;
  1047.  
  1048.   /* If we don't have any state, make some. */
  1049.   if (!state)
  1050.     {
  1051.       if (list)
  1052.     free (list);
  1053.  
  1054.       list = (char **)NULL;
  1055.  
  1056.       first_char_loc = 0;
  1057.       first_char = *text;
  1058.  
  1059.       if (first_char == '@')
  1060.     first_char_loc++;
  1061.  
  1062.       list = hostnames_matching (&text[first_char_loc]);
  1063.       list_index = 0;
  1064.     }
  1065.  
  1066.   if (list && list[list_index])
  1067.     {
  1068.       char *t = xmalloc (2 + strlen (list[list_index]));
  1069.  
  1070.       *t = first_char;
  1071.       strcpy (t + first_char_loc, list[list_index]);
  1072.       list_index++;
  1073.       return (t);
  1074.     }
  1075.   else
  1076.     return ((char *)NULL);
  1077. }
  1078.  
  1079. /* History and alias expand the line. */
  1080. static char *
  1081. history_expand_line_internal (line)
  1082.      char *line;
  1083. {
  1084.   char *new_line;
  1085.  
  1086.   new_line = pre_process_line (line, 0, 0);
  1087.   return new_line;
  1088. }
  1089.  
  1090. #if defined (ALIAS)
  1091. /* Perform alias expansion on LINE and return the new line. */
  1092. static char *
  1093. alias_expand_line_internal (line)
  1094.      char *line;
  1095. {
  1096.   char *alias_line;
  1097.  
  1098.   alias_line = alias_expand (line);
  1099.   return alias_line;
  1100. }
  1101. #endif
  1102.  
  1103. /* There was an error in expansion.  Let the preprocessor print
  1104.    the error here. */
  1105. static void
  1106. cleanup_expansion_error ()
  1107. {
  1108.   char *to_free;
  1109.  
  1110.   fprintf (rl_outstream, "\r\n");
  1111.   to_free = pre_process_line (rl_line_buffer, 1, 0);
  1112.   free (to_free);
  1113.   putc ('\r', rl_outstream);
  1114.   rl_forced_update_display ();
  1115. }
  1116.  
  1117. /* If NEW_LINE differs from what is in the readline line buffer, add an
  1118.    undo record to get from the readline line buffer contents to the new
  1119.    line and make NEW_LINE the current readline line. */
  1120. static void
  1121. maybe_make_readline_line (new_line)
  1122.      char *new_line;
  1123. {
  1124.   if (strcmp (new_line, rl_line_buffer) != 0)
  1125.     {
  1126.       rl_point = rl_end;
  1127.  
  1128.       rl_add_undo (UNDO_BEGIN, 0, 0, 0);
  1129.       rl_delete_text (0, rl_point);
  1130.       rl_point = rl_end = 0;
  1131.       rl_insert_text (new_line);
  1132.       rl_add_undo (UNDO_END, 0, 0, 0);
  1133.     }
  1134. }
  1135.  
  1136. /* Make NEW_LINE be the current readline line.  This frees NEW_LINE. */
  1137. static void
  1138. set_up_new_line (new_line)
  1139.      char *new_line;
  1140. {
  1141.   int old_point = rl_point;
  1142.   int at_end = rl_point == rl_end;
  1143.  
  1144.   /* If the line was history and alias expanded, then make that
  1145.      be one thing to undo. */
  1146.   maybe_make_readline_line (new_line);
  1147.   free (new_line);
  1148.  
  1149.   /* Place rl_point where we think it should go. */
  1150.   if (at_end)
  1151.     rl_point = rl_end;
  1152.   else if (old_point < rl_end)
  1153.     {
  1154.       rl_point = old_point;
  1155.       if (!whitespace (rl_line_buffer[rl_point]))
  1156.     rl_forward_word (1);
  1157.     }
  1158. }
  1159.  
  1160. /* History expand the line. */
  1161. static void
  1162. history_expand_line (ignore)
  1163.      int ignore;
  1164. {
  1165.   char *new_line;
  1166.  
  1167.   new_line = history_expand_line_internal (rl_line_buffer);
  1168.  
  1169.   if (new_line)
  1170.     set_up_new_line (new_line);
  1171.   else
  1172.     cleanup_expansion_error ();
  1173. }
  1174.   
  1175. /* History and alias expand the line. */
  1176. static void
  1177. history_and_alias_expand_line (ignore)
  1178.      int ignore;
  1179. {
  1180.   char *new_line;
  1181.  
  1182.   new_line = pre_process_line (rl_line_buffer, 0, 0);
  1183.  
  1184. #if defined (ALIAS)
  1185.   if (new_line)
  1186.     {
  1187.       char *alias_line;
  1188.  
  1189.       alias_line = alias_expand (new_line);
  1190.       free (new_line);
  1191.       new_line = alias_line;
  1192.     }
  1193. #endif /* ALIAS */
  1194.  
  1195.   if (new_line)
  1196.     set_up_new_line (new_line);
  1197.   else
  1198.     cleanup_expansion_error ();
  1199. }
  1200.  
  1201. /* History and alias expand the line, then perform the shell word
  1202.    expansions by calling expand_string. */
  1203. static void
  1204. shell_expand_line (ignore)
  1205.      int ignore;
  1206. {
  1207.   char *new_line;
  1208.  
  1209.   new_line = pre_process_line (rl_line_buffer, 0, 0);
  1210.  
  1211. #if defined (ALIAS)
  1212.   if (new_line)
  1213.     {
  1214.       char *alias_line;
  1215.  
  1216.       alias_line = alias_expand (new_line);
  1217.       free (new_line);
  1218.       new_line = alias_line;
  1219.     }
  1220. #endif /* ALIAS */
  1221.  
  1222.   if (new_line)
  1223.     {
  1224.       int old_point = rl_point;
  1225.       int at_end = rl_point == rl_end;
  1226.  
  1227.       /* If the line was history and alias expanded, then make that
  1228.      be one thing to undo. */
  1229.       maybe_make_readline_line (new_line);
  1230.       free (new_line);
  1231.  
  1232.       /* If there is variable expansion to perform, do that as a separate
  1233.      operation to be undone. */
  1234.       {
  1235.     WORD_LIST *expanded_string;
  1236.  
  1237.     expanded_string = expand_string (rl_line_buffer, 0);
  1238.     if (!expanded_string)
  1239.       new_line = savestring ("");
  1240.     else
  1241.       {
  1242.         new_line = string_list (expanded_string);
  1243.         dispose_words (expanded_string);
  1244.       }
  1245.  
  1246.     maybe_make_readline_line (new_line);
  1247.     free (new_line);
  1248.  
  1249.     /* Place rl_point where we think it should go. */
  1250.     if (at_end)
  1251.       rl_point = rl_end;
  1252.     else if (old_point < rl_end)
  1253.       {
  1254.         rl_point = old_point;
  1255.         if (!whitespace (rl_line_buffer[rl_point]))
  1256.           rl_forward_word (1);
  1257.       }
  1258.       }
  1259.     }
  1260.   else
  1261.     cleanup_expansion_error ();
  1262. }
  1263.  
  1264. /* Filename completion ignore.  Emulates the "fignore" facility of
  1265.    tcsh.  If FIGNORE is set, then don't match files with the
  1266.    given suffixes.  If only one of the possibilities has an acceptable
  1267.    suffix, delete the others, else just return and let the completer
  1268.    signal an error.  It is called by the completer when real
  1269.    completions are done on filenames by the completer's internal
  1270.    function, not for completion lists (M-?) and not on "other"
  1271.    completion types, such as hostnames or commands.
  1272.  
  1273.    It is passed a NULL-terminated array of (char *)'s that must be
  1274.    free()'d if they are deleted.  The first element (names[0]) is the
  1275.    least-common-denominator string of the matching patterns (i.e.
  1276.    u<TAB> produces names[0] = "und", names[1] = "under.c", names[2] =
  1277.    "undun.c", name[3] = NULL).  */
  1278.  
  1279. struct ign {
  1280.   char *val;
  1281.   int len;
  1282. };
  1283.  
  1284. static struct ign *ignores;    /* Store the ignore strings here */
  1285. static int num_ignores;        /* How many are there? */
  1286. static char *last_fignore;    /* Last value of fignore - cached for speed */
  1287.  
  1288. static void
  1289. setup_ignore_patterns ()
  1290. {
  1291.   int numitems, maxitems, ptr;
  1292.   char *colon_bit;
  1293.   struct ign *p;
  1294.   
  1295.   char *this_fignore = get_string_value ("FIGNORE");
  1296.  
  1297.   /* If nothing has changed then just exit now. */
  1298.   if ((this_fignore &&
  1299.        last_fignore &&
  1300.        strcmp (this_fignore, last_fignore) == 0) ||
  1301.       (!this_fignore && !last_fignore))
  1302.     {
  1303.       return;
  1304.     }
  1305.  
  1306.   /* Oops.  FIGNORE has changed.  Re-parse it. */
  1307.   num_ignores = 0;
  1308.  
  1309.   if (ignores)
  1310.     {
  1311.       for (p = ignores; p->val; p++) free(p->val);
  1312.       free (ignores);
  1313.       ignores = (struct ign*)NULL;
  1314.     }
  1315.  
  1316.   if (last_fignore)
  1317.     {
  1318.       free (last_fignore);
  1319.       last_fignore = (char *)NULL;
  1320.     }
  1321.  
  1322.   if (!this_fignore || !*this_fignore)
  1323.     return;
  1324.  
  1325.   last_fignore = savestring (this_fignore);
  1326.  
  1327.   numitems = maxitems = ptr = 0;
  1328.  
  1329.   while (colon_bit = extract_colon_unit (this_fignore, &ptr))
  1330.     {
  1331.       if (numitems + 1 > maxitems)
  1332.     ignores = (struct ign *)
  1333.       xrealloc (ignores, (maxitems += 10) * sizeof (struct ign));
  1334.  
  1335.       ignores[numitems].val = colon_bit;
  1336.       ignores[numitems].len = strlen (colon_bit);
  1337.       numitems++;
  1338.     }
  1339.   ignores[numitems].val = NULL;
  1340.   num_ignores = numitems;
  1341. }
  1342.  
  1343. static int
  1344. name_is_acceptable (name)
  1345.      char *name;
  1346. {
  1347.   struct ign *p;
  1348.   int nlen = strlen (name);
  1349.  
  1350.   for (p = ignores; p->val; p++) 
  1351.     {
  1352.       if (nlen > p->len && p->len > 0 && 
  1353.       strcmp (p->val, &name[nlen - p->len]) == 0)
  1354.     return (0);
  1355.     }
  1356.  
  1357.   return (1);
  1358. }
  1359.  
  1360. /* Internal function to test whether filenames in NAMES should be
  1361.    ignored.  NAME_FUNC is a pointer to a function to call with each
  1362.    name.  It returns non-zero if the name is acceptable to the particular
  1363.    ignore function which called _ignore_names; zero if the name should
  1364.    be removed from NAMES. */
  1365. static void
  1366. _ignore_names (names, name_func)
  1367.      char **names;
  1368.      Function *name_func;
  1369. {
  1370.   char **p;
  1371.   int idx;
  1372.  
  1373.   for (p = names + 1, idx = -1; *p; p++)
  1374.     {
  1375.       if ((*name_func) (*p))
  1376.     {
  1377.       if (idx == -1)    /* First match found. */
  1378.         idx = p - names;
  1379.       else
  1380.         return;        /* Too many matches. */
  1381.     }
  1382.     }
  1383.   
  1384.   /* If none are acceptable then let the completer handle it. */
  1385.   if (idx == -1)
  1386.     return;
  1387.  
  1388.   /* Delete all non-matching elements. */
  1389.   free (names[0]); 
  1390.   for (p = names + 1; *p; p++)
  1391.     {
  1392.       if (idx == (p - names))
  1393.     names[0] = *p;
  1394.       else 
  1395.     free (*p);
  1396.  
  1397.       *p = NULL;
  1398.     }
  1399. }
  1400.  
  1401. static void
  1402. filename_completion_ignore (names)
  1403.      char **names;
  1404. {
  1405.   setup_ignore_patterns ();
  1406.  
  1407.   if (num_ignores == 0)
  1408.     return;
  1409.  
  1410.   _ignore_names (names, name_is_acceptable);
  1411. }
  1412.  
  1413. /* Return 1 if NAME is a directory. */
  1414. static int
  1415. test_for_directory (name)
  1416.      char *name;
  1417. {
  1418.   struct stat finfo;
  1419.   char *fn;
  1420.  
  1421.   fn = tilde_expand (name);
  1422.   if (stat (fn, &finfo) != 0)
  1423.     {
  1424.       free (fn);
  1425.       return 0;
  1426.     }
  1427.   free (fn);
  1428.   return (S_ISDIR (finfo.st_mode));
  1429. }
  1430.  
  1431. /* Remove files from NAMES, leaving directories. */
  1432. static void
  1433. bash_ignore_filenames (names)
  1434.      char **names;
  1435. {
  1436.   _ignore_names (names, test_for_directory);
  1437. }
  1438.  
  1439. /* Handle symbolic link references and other directory name
  1440.    expansions while hacking completion. */
  1441. static int
  1442. bash_directory_completion_hook (dirname)
  1443.      char **dirname;
  1444. {
  1445.   char *local_dirname, *t;
  1446.   int return_value = 0;
  1447.   WORD_LIST *wl;
  1448.  
  1449.   local_dirname = *dirname;
  1450.   if (strchr (local_dirname, '$') || strchr (local_dirname, '`'))
  1451.     {
  1452.       wl = expand_string (local_dirname, 0);
  1453.       if (wl)
  1454.     {
  1455.       *dirname = string_list (wl);
  1456.       /* Tell the completer to replace the directory name only if we
  1457.          actually expanded something. */
  1458.       return_value = STREQ (local_dirname, *dirname) == 0;
  1459.       free (local_dirname);
  1460.       dispose_words (wl);
  1461.       local_dirname = *dirname;
  1462.     }
  1463.       else
  1464.     {
  1465.       free (local_dirname);
  1466.       *dirname = savestring ("");
  1467.       return 1;
  1468.     }
  1469.     }
  1470.  
  1471.   if (!no_symbolic_links && (local_dirname[0] != '.' || local_dirname[1]))
  1472.     {
  1473.       char *temp1, *temp2;
  1474.       int len1, len2;
  1475.  
  1476.       t = get_working_directory ("symlink-hook");
  1477.       temp1 = make_absolute (local_dirname, t);
  1478.       free (t);
  1479.       temp2 = canonicalize_pathname (temp1);
  1480.       len1 = strlen (temp1);
  1481.       if (temp1[len1 - 1] == '/')
  1482.         {
  1483.       len2 = strlen (temp2);
  1484.           temp2 = xrealloc (temp2, len2 + 2);
  1485.           temp2[len2] = '/';
  1486.           temp2[len2 + 1] = '\0';
  1487.         }
  1488.       free (local_dirname);
  1489.       *dirname = temp2;
  1490.       free (temp1);
  1491.     }
  1492.   return (return_value);
  1493. }
  1494.  
  1495. #if defined (DYNAMIC_HISTORY_COMPLETION)
  1496. static char **history_completion_array = (char **)NULL;
  1497. static int harry_size = 0;
  1498. static int harry_len = 0;
  1499.  
  1500. static void
  1501. build_history_completion_array ()
  1502. {
  1503.   register int i;
  1504.  
  1505.   /* First, clear out the current dynamic history completion list. */
  1506.   if (harry_size)
  1507.     {
  1508.       for (i = 0; history_completion_array[i]; i++)
  1509.     free (history_completion_array[i]);
  1510.  
  1511.       free (history_completion_array);
  1512.  
  1513.       history_completion_array = (char **)NULL;
  1514.       harry_size = 0;
  1515.       harry_len = 0;
  1516.     }
  1517.  
  1518.   /* Next, grovel each line of history, making each shell-sized token
  1519.      a separate entry in the history_completion_array. */
  1520.   {
  1521.     HIST_ENTRY **hlist;
  1522.  
  1523.     hlist = history_list ();
  1524.  
  1525.     if (hlist)
  1526.       {
  1527.     register int j;
  1528.  
  1529.     for (i = 0; hlist[i]; i++)
  1530.       {
  1531.         char **tokens;
  1532.  
  1533.         /* Separate each token, and place into an array. */
  1534.         tokens = history_tokenize (hlist[i]->line);
  1535.  
  1536.         for (j = 0; tokens && tokens[j]; j++)
  1537.           {
  1538.         if (harry_len + 2 > harry_size)
  1539.           history_completion_array = (char **) xrealloc
  1540.             (history_completion_array,
  1541.              (harry_size += 10) * sizeof (char *));
  1542.  
  1543.         history_completion_array[harry_len++] = tokens[j];
  1544.         history_completion_array[harry_len] = (char *)NULL;
  1545.           }
  1546.         free (tokens);
  1547.       }
  1548.  
  1549.     /* Sort the complete list of tokens. */
  1550.     qsort (history_completion_array, harry_len, sizeof (char *),
  1551.            (Function *)qsort_string_compare);
  1552.  
  1553.     /* Instead of removing the duplicate entries here, we let the
  1554.        code in the completer handle it. */
  1555.       }
  1556.   }
  1557. }
  1558.  
  1559. static char *
  1560. history_completion_generator (hint_text, state)
  1561.      char *hint_text;
  1562.      int state;
  1563. {
  1564.   static int local_index = 0;
  1565.   static char *text = (char *)NULL;
  1566.   static int len = 0;
  1567.  
  1568.   /* If this is the first call to the generator, then initialize the
  1569.      list of strings to complete over. */
  1570.   if (!state)
  1571.     {
  1572.       local_index = 0;
  1573.       build_history_completion_array ();
  1574.       text = hint_text;
  1575.       len = strlen (text);
  1576.     }
  1577.  
  1578.   while (history_completion_array && history_completion_array[local_index])
  1579.     {
  1580.       if (strncmp (text, history_completion_array[local_index++], len) == 0)
  1581.     return (savestring (history_completion_array[local_index - 1]));
  1582.     }
  1583.   return ((char *)NULL);
  1584. }
  1585.  
  1586. static void
  1587. dynamic_complete_history (count, key)
  1588.      int count, key;
  1589. {
  1590.   Function *orig_func;
  1591.   CPPFunction *orig_attempt_func;
  1592.  
  1593.   orig_func = rl_completion_entry_function;
  1594.   orig_attempt_func = rl_attempted_completion_function;
  1595.   rl_completion_entry_function = (Function *)history_completion_generator;
  1596.   rl_attempted_completion_function = (CPPFunction *)NULL;
  1597.  
  1598.   if (rl_last_func == (Function *)dynamic_complete_history)
  1599.     rl_complete_internal ('?');
  1600.   else
  1601.     rl_complete_internal (TAB);
  1602.  
  1603.   rl_completion_entry_function = orig_func;
  1604.   rl_attempted_completion_function = orig_attempt_func;
  1605. }
  1606.  
  1607. #endif /* DYNAMIC_HISTORY_COMPLETION */
  1608.  
  1609. #if defined (SPECIFIC_COMPLETION_FUNCTIONS)
  1610. static void
  1611. bash_complete_username (ignore, ignore2)
  1612.      int ignore, ignore2;
  1613. {
  1614.   bash_complete_username_internal (TAB);
  1615. }
  1616.  
  1617. static void
  1618. bash_possible_username_completions (ignore, ignore2)
  1619.      int ignore, ignore2;
  1620. {
  1621.   bash_complete_username_internal ('?');
  1622. }
  1623.  
  1624. static void
  1625. bash_complete_username_internal (what_to_do)
  1626.      int what_to_do;
  1627. {
  1628.   bash_specific_completion
  1629.     (what_to_do, (Function *)username_completion_function);
  1630. }
  1631.  
  1632. static void
  1633. bash_complete_filename (ignore, ignore2)
  1634.      int ignore, ignore2;
  1635. {
  1636.   bash_complete_filename_internal (TAB);
  1637. }
  1638.  
  1639. static void
  1640. bash_possible_filename_completions (ignore, ignore2)
  1641.      int ignore, ignore2;
  1642. {
  1643.   bash_complete_filename_internal ('?');
  1644. }
  1645.  
  1646. static void
  1647. bash_complete_filename_internal (what_to_do)
  1648.      int what_to_do;
  1649. {
  1650.   Function  *orig_func, *orig_dir_func;
  1651.   CPPFunction *orig_attempt_func;
  1652.   char *orig_rl_completer_word_break_characters;
  1653.  
  1654.   orig_func = rl_completion_entry_function;
  1655.   orig_attempt_func = rl_attempted_completion_function;
  1656.   orig_dir_func = rl_directory_completion_hook;
  1657.   orig_rl_completer_word_break_characters = rl_completer_word_break_characters;
  1658.   rl_completion_entry_function = (Function *)filename_completion_function;
  1659.   rl_attempted_completion_function = (CPPFunction *)NULL;
  1660.   rl_directory_completion_hook = (Function *)NULL;
  1661.   rl_completer_word_break_characters = " \t\n\"\'";
  1662.  
  1663.   rl_complete_internal (what_to_do);
  1664.  
  1665.   rl_completion_entry_function = orig_func;
  1666.   rl_attempted_completion_function = orig_attempt_func;
  1667.   rl_directory_completion_hook = orig_dir_func;
  1668.   rl_completer_word_break_characters = orig_rl_completer_word_break_characters;
  1669. }
  1670.  
  1671. static void
  1672. bash_complete_hostname (ignore, ignore2)
  1673.      int ignore, ignore2;
  1674. {
  1675.   bash_complete_hostname_internal (TAB);
  1676. }
  1677.  
  1678. static void
  1679. bash_possible_hostname_completions (ignore, ignore2)
  1680.      int ignore, ignore2;
  1681. {
  1682.   bash_complete_hostname_internal ('?');
  1683. }
  1684.  
  1685. static void
  1686. bash_complete_variable (ignore, ignore2)
  1687.      int ignore, ignore2;
  1688. {
  1689.   bash_complete_variable_internal (TAB);
  1690. }
  1691.  
  1692. static void
  1693. bash_possible_variable_completions (ignore, ignore2)
  1694.      int ignore, ignore2;
  1695. {
  1696.   bash_complete_variable_internal ('?');
  1697. }
  1698.  
  1699. static void
  1700. bash_complete_command (ignore, ignore2)
  1701.      int ignore, ignore2;
  1702. {
  1703.   bash_complete_command_internal (TAB);
  1704. }
  1705.  
  1706. static void
  1707. bash_possible_command_completions (ignore, ignore2)
  1708.      int ignore, ignore2;
  1709. {
  1710.   bash_complete_command_internal ('?');
  1711. }
  1712.  
  1713. static void
  1714. bash_complete_hostname_internal (what_to_do)
  1715.      int what_to_do;
  1716. {
  1717.   bash_specific_completion
  1718.     (what_to_do, (Function *)hostname_completion_function);
  1719. }
  1720.  
  1721. static void
  1722. bash_complete_variable_internal (what_to_do)
  1723.      int what_to_do;
  1724. {
  1725.   bash_specific_completion
  1726.     (what_to_do, (Function *)variable_completion_function);
  1727. }
  1728.  
  1729. static void
  1730. bash_complete_command_internal (what_to_do)
  1731.      int what_to_do;
  1732. {
  1733.   bash_specific_completion
  1734.     (what_to_do, (Function *)command_word_completion_function);
  1735. }
  1736.  
  1737. static void
  1738. bash_specific_completion (what_to_do, generator)
  1739.      int what_to_do;
  1740.      Function *generator;
  1741. {
  1742.   Function *orig_func;
  1743.   CPPFunction *orig_attempt_func;
  1744.  
  1745.   orig_func = rl_completion_entry_function;
  1746.   orig_attempt_func = rl_attempted_completion_function;
  1747.   rl_completion_entry_function = generator;
  1748.   rl_attempted_completion_function = (CPPFunction *)NULL;
  1749.  
  1750.   rl_complete_internal (what_to_do);
  1751.  
  1752.   rl_completion_entry_function = orig_func;
  1753.   rl_attempted_completion_function = orig_attempt_func;
  1754. }
  1755.  
  1756. #endif    /* SPECIFIC_COMPLETION_FUNCTIONS */
  1757.